//
// Created by ASUS on 2024/4/18/星期四.
//
#include <bits/stdc++.h>
using namespace std;

int f(int n) {
	auto s = to_string(n);//把数字转换成字符串
	int m = s.length(), memo[m];
	memset(memo, -1, sizeof(memo));
	function<int(int, bool,bool)> dfs = [&](int i, bool is_limit,bool is_num) -> int {
		if (i == m) return is_num;
		if (is_num&&!is_limit && memo[i] !=-1) return memo[i];
		int res = 0;
		if(!is_num) res+=dfs(i+1,false,false);//不填数字
		for (int d = 1-is_num, up = is_limit ? s[i] - '0' : 9; d <= up; ++d) // 枚举第i位要填入的数字 d
			res += dfs(i + 1, is_limit && d == up,true);//枚举下一位
		if (is_num&&!is_limit) memo[i] = res;
		return res;
	};
	return dfs(0, true,false);
}